home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Compendium Deluxe 2
/
LSD and 17bit Compendium Deluxe - Volume II.iso
/
a
/
prog
/
asmsrc
/
tangosources.lha
/
vector_sources
/
CUBE.S
Wrap
Text File
|
2008-06-03
|
5KB
|
334 lines
; VECTOR ROUTINE V1.0 (C) 1990 WILDTANG PRODUCTIONS
; X,Y,Z ANGLES IMPLEMENTED.
; CHEERS TO KREATOR FOR THE FAST FORMULA, WHICH WITHOUT WE NO WAY COULD
; HAVE CODED THIS ROUTINE
section program,code_c
opt c-
incdir df1:
include gamemacros
; -- Local constants --
rotatedpoints =$75000
; -- Killsystem and exit routine --
bsr copyshape
lea custom,a5
killsys
move.l #newcop,$dff080
mouse:
cmp.b #$ff,$dff006
bne.s mouse
BTST #$7,$BFE001
BNE ASASAS
ADD.W #1,SCALE
ASASAS
add.w #4,zrotation
and.w #510,zrotation
add.w #4,xrotation
and.w #510,Xrotation
add.w #6,Yrotation
and.w #510,Yrotation
bsr rotating
bsr clearvector
save_all
bsr drawingthi
return_all
btst #6,$bfe001
bne.s mouse
ressys
clr.l d0
rts
; Blit clear the vector screen
clearvector:
blitwait
Move.w #0,BltdMod(a5)
move.w #%0000000100000000,BltCon0(a5)
Move.w #$0000,BltCon1(a5)
Move.w #$ffff,Bltalwm(a5)
Move.w #$ffff,Bltafwm(a5)
Move.l #$70000,Bltdpth(a5)
Move.w #256*64+20,BltSize(a5)
rts
; -- Copy vector --
copyshape:
lea points,a1
lea rotatedpoints,a2
move.w (a1),d2 .No of points
add.w #1,d2
mulu #6,d2
copyloop:
move.b (a1)+,(a2)+
dbf d2,copyloop
rts
rotating
lea rotatedpoints+2,a3
lea points,a6
move.w (A6)+,d7
lea sin+64,a1 base of sine
rotate
move.w 0(a6),d0 x
move.w 2(a6),d1 y
cmp.w #0,d0
blt misx
sub.w scale,d0
bra misx1
misx
add.w scale,d0
misx1
cmp.w #0,d1
blt misy
sub.w scale,d1
bra misy1
misy
add.w scale,d1
misy1
move.w zrotation,d6 rotation
bsr getsincos
; X1 = X COS(B)-Y SIN(A)
; Y1 = Y COS(B)+X SIN(A)
move.w d0,xspace
move.w d3,d0 y in d0
move.w 4(a6),d1
cmp.w #0,d1
blt misz
sub.w scale,d1
bra misz1
misz
add.w scale,d1
misz1
move.w yrotation,d6 rotation
; Y2 = Y1 COS(B)-Z SIN(B)
; Z1 = Z COS(B)+Y1 SIN(B)
bsr getsincos
move.w d0,yspace
move.w d3,d0
move.w xspace,d1
move.w xrotation,d6 rotation
; Z2 = Z1 COS(C)-X1 SIN(C)
; Z1 = X1 COS(B)+Z1 SIN(C)
bsr getsincos
move.w yspace,d1
add.w #160,d0
add.w #100,d1
move.w d0,0(a3) x
move.w d1,2(a3) y
move.w d3,4(a3) z
add.l #6,a6
add.l #6,a3
dbf d7,rotate
rts
SCALE DC.L 20
getsincos
move.w d0,d2 store x
move.w d1,d3 store y
move 64(a1,d6),d4 cosine value
move -64(a1,d6),d5 sine value
muls d4,d0 x cos (a)
muls d5,d1 y sin (a)
sub.l d1,d0 x cos (a) - y sin (a)
add.l d0,d0 double it
swap d0 swap it ( divu 32768 )
muls d5,d2 x sin (a)
muls d4,d3 y cos (a)
add.l d2,d3 y cos (a) + x sin (a)
add.l d3,d3 double it
swap d3 swap it ( divu 32768 )
rts
drawingthi
moveq #0,d7
move.l #$70000,a0
move.l #40,a1
move.l #$ffffffff,a2
move.l #Conects,a6
move.w (a6)+,d7 Amount of conects
lea rotatedpoints+2,a4
drawvector
move.w (a6)+,d5
move.w (a4,d5),d0
move.w 2(a4,d5),d1
move.w (a6)+,d5
move.w (a4,d5),d2
move.w 2(a4,d5),d3
movem.l d0-d7/a0-a6,-(a7)
bsr Drawline
movem.l (a7)+,d0-d7/a0-a6
dbf d7,drawvector
rts
; -- Draw line routine --
; D0 = X1
; D1 = Y1
; D2 = X2
; D3 = Y2
; A0 = BIT MAP
; A1 = BITPLANE WIDTH IN BYTES
; A2 = MASK
; D4 TO D6 WORK REGS
DrawLine
cmp.w d0,d2
bne outing
cmp.w d1,d3
bne outing
rts
outing
Move.l A1,D4
Mulu D1,D4
Moveq #-$10,D5
And.w D0,D5
Lsr.w #3,D5
Add.w D5,D4
Add.l A0,D4
Clr.l D5
Sub.w D1,D3
roxl.b #1,D5
tst.w d3
Bge.s Y2gyl
neg.w d3
y2gyl
sub.w d0,d2
roxl.b #1,d5
tst.w d2
bge.s xtgxl
neg.w d2
xtgxl
move.w d3,d1
sub.w d2,d1
bge.s dygdx
exg d2,d3
dygdx
roxl.b #1,d5
move.b OCtant_Table(pc,D5),d5
Add.w d2,d2
Lea Custom,a5
BlitWait
Move.w d2,bltbmod(a5)
sub.w d3,d2
bge.s sighn1
or.b #$40,d5
sighn1
Move.w d2,bltaptl(a5)
sub.w d3,d2
move.w d2,bltamod(A5)
move.w #$8000,bltadat(a5)
move.w a2,bltbdat(a5)
move.w #$ffff,bltafwm(a5)
and.w #$000f,d0
ror.w #4,d0
or.w #$0bca,d0
move.w d0,bltcon0(a5)
move.w d5,bltcon1(a5)
move.l d4,bltcpth(A5)
move.l d4,bltdpth(A5)
move.w a1,bltcmod(a5)
move.w a1,bltdmod(a5)
lsl.w #6,d3
addq.w #2,d3
move.w d3,bltsize(A5)
rts
; -- Octants for line draw routine --
Octant_Table
dc.b 0*4+1
Dc.b 4*4+1
dc.b 2*4+1
dc.b 5*4+1
dc.b 1*4+1
dc.b 6*4+1
dc.b 3*4+1
dc.b 7*4+1
even
; -- New copper list example --
newcop:
cmove bplcon0,$1200
cmove bpl1mod,$0000
cmove bpl2mod,$0000
cmove diwstrt,$3c81
cmove diwstop,$3cc1
cmove ddfstrt,$0038
cmove ddfstop,$00d0
cmove color00,$0000
cmove bpl1pth,$0007
cmove bpl1ptl,$0000
end_copper
; -- Data and variables --
zrotation
dc.l 0
xrotation
dc.l 0
yrotation
dc.l 0
xspace
dc.l 0
yspace
dc.l 0
; -- Vector shapes --
Points
dc.w 8-1
; x,y,z
Dc.w 50,50,50
Dc.w -50,50,50
Dc.w -50,-50,50
Dc.w 50,-50,50
Dc.w 50,50,-50
Dc.w -50,50,-50
Dc.w -50,-50,-50
Dc.w 50,-50,-50
Conects
dc.w 12-1 Connecting points
dc.w 0*6,1*6
dc.w 1*6,2*6
dc.w 2*6,3*6
dc.w 3*6,0*6
dc.w 4*6,5*6
dc.w 5*6,6*6
dc.w 6*6,7*6
dc.w 7*6,4*6
dc.w 0*6,4*6
dc.w 1*6,5*6
dc.w 2*6,6*6
dc.w 3*6,7*6
; -- Sine table included here --
sin:
rept 2
incbin misc_sources/sin
endr
even